import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:my_flutter_github/MyStyle.dart';


//通过下拉刷新控件
class PullLoadWidget extends StatefulWidget {

  ///item渲染
  final IndexedWidgetBuilder itemBuilder;

  ///加载更多回调
  final RefreshCallback loadMoreCallback;

  ///刷新回调
  final RefreshCallback refreshCallback;

  ///控制器，数据配置，以及其他配置
  final PullLoadWidgetControl control;

  final Key refreshKey;

  PullLoadWidget({this.itemBuilder, this.loadMoreCallback, this.refreshCallback,
      this.control, this.refreshKey});

  @override
  _PullLoadWidgetState createState() => _PullLoadWidgetState();
}

class _PullLoadWidgetState extends State<PullLoadWidget> {

  ScrollController _scrollController = new ScrollController();

  @override
  void initState() {
    //增加滑动监听
    _scrollController.addListener(() {
      ///判断当前滑动位置是不是到达底部，触发加载更多回调
      if (_scrollController.position.pixels >=
          _scrollController.position.maxScrollExtent) {
        if (widget.control.needLoadMore) {
          widget.loadMoreCallback?.call();
        }
      }
    });


    super.initState();
  }

  ///根据配置状态返回实际列表数量
  ///实际上这里可以根据你的需要做更多的处理
  ///比如多个头部，是否需要空页面，是否需要显示加载更多。
  _getListCount() {
    ///是否需要头部
    if (widget.control.needHeader) {
      ///如果需要头部，用Item 0 的 Widget 作为ListView的头部
      ///列表数量大于0时，因为头部和底部加载更多选项，需要对列表数据总数+2
      return (widget.control.dataList.length > 0) ? (widget.control.dataList
          .length + 2) : (widget.control.dataList.length + 1);
    } else {
      if (widget.control.dataList.length == 0) {
        return 1;
      } else {
        ///如果有数据,因为部加载更多选项，需要对列表数据总数+1
        return widget.control.dataList.length > 0 ? (widget.control.dataList
            .length + 1) : (widget.control.dataList.length);
      }
    }
  }

  ///根据配置状态返回实际列表渲染Item
  _getItem(int index) {
    if (!widget.control.needHeader && index == widget.control.dataList.length &&
        widget.control.dataList.length > 0) {
      ///如果不需要头部，并且数据不为0，当index等于数据长度时，渲染加载更多Item（因为index是从0开始）
      return _buildProgressIndicator();
    } else if (widget.control.needHeader && index == _getListCount() - 1 &&
        widget.control.dataList.length > 0) {
      ///如果需要头部，并且数据不为0，当index等于实际渲染长度 - 1时，渲染加载更多Item（因为index是从0开始）
      return _buildProgressIndicator();
    } else
    if (!widget.control.needHeader && widget.control.dataList.length == 0) {
      ///如果不需要头部，并且数据为0，渲染空页面
      return _buildEmpty();
    } else {
      ///回调外部正常渲染Item，如果这里有需要，可以直接返回相对位置的index
      return widget.itemBuilder(context, index);
      ///
    }
  }

  @override
  Widget build(BuildContext context) {
    return new RefreshIndicator(

      ///GlobalKey，用户外部获取RefreshIndicator的State，做显示刷新
        key: widget.refreshKey,
        child: new ListView.builder(
          ///保持ListView任何情况都能滚动，解决在RefreshIndicator的兼容问题。
          physics: const AlwaysScrollableScrollPhysics(),
            itemBuilder: (context, index) {
              return _getItem(index);
            },
          itemCount: _getListCount(),
          controller: _scrollController,
        ),

        ///下拉刷新触发，返回的是一个Future
        onRefresh: widget.refreshCallback);
  }

  ///空页面
  Widget _buildEmpty() {
    return new Container(
      height: MediaQuery
          .of(context)
          .size
          .height - 100,
      child: new Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          FlatButton(
              onPressed: null,
              child: new Image(
                image: new AssetImage(MyIcons.DEFAULT_USER_ICON),
                width: 70.0,
                height: 70.0,
              )
          ),

          Container(
            child: Text("数据为空", style: MyConstants.normalText,),
          ),
        ],
      ),
    );
  }

  ///上拉加载更多
  Widget _buildProgressIndicator() {
    ///是否需要显示上拉加载更多的loading
    Widget bottomWidget = new Container();
    if (widget.control.needLoadMore) {
      bottomWidget = new Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          //loading框
          new SpinKitRotatingCircle(color: Theme.of(context).primaryColor),
          new Container(width: 5.0,),
          new Text(
            "正在加载更多...",
            style: TextStyle(
              color: Color(0xFF121917),
              fontSize: 14.0,
              fontWeight: FontWeight.bold,
            ),
          ),
        ],
      );
    }


    return new Padding(
        padding: new EdgeInsets.all(20.0),
        child: new Center(
          child: bottomWidget,
        ),
    );

  }

}


class PullLoadWidgetControl {
  ///数据，对齐增减，不能替换
  List dataList = new List();

  ///是否需要加载更多
  bool needLoadMore = true;

  ///是否需要头部
  bool needHeader = false;
}
